package com.example.parent.bookmanage_jpa.dao;

import com.example.parent.bookmanage_jpa.entity.Book;
import jakarta.transaction.Transactional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 图书数据访问层接口
 * 继承JpaRepository提供基础CRUD操作，同时定义自定义查询方法
 * 负责图书实体与数据库之间的交互
 */
@Repository // 标识为数据访问层组件，由Spring自动扫描管理
// 继承JpaRepository<Book, Integer>：提供默认的CRUD操作，泛型为实体类和主键类型
public interface BookRepository extends JpaRepository<Book, Integer> {

    /**
     * 根据作者和状态查询图书
     * Spring Data JPA会根据方法名自动生成SQL：SELECT * FROM book WHERE author = ? AND status = ?
     *
     * @param author 图书作者
     * @param status 图书状态
     * @return Book 符合条件的图书实体
     */
    Book findByAuthorAndStatus(String author, String status);

    /**
     * 根据ID删除图书（自定义JPQL查询）
     * 使用@Query注解定义JPQL语句，实现自定义删除逻辑
     *
     * @param id 图书ID
     * @return List<Book> 通常删除操作返回受影响的行数，此处返回值类型可能需要调整
     */
    @Modifying // 标识为修改操作（INSERT/UPDATE/DELETE），必须与@Transactional配合使用
    @Transactional // 声明事务支持，确保删除操作的原子性
    @Query("delete from Book b where b.id = :id")
    // JPQL删除语句，:id为命名参数
    List<Book> deleteBookById(@Param("id") Integer id); // @Param映射方法参数到JPQL中的命名参数
}